package sf_errors

import (
	"errors"
	"fmt"
	"github.com/gin-gonic/gin"
	"strings"
)

// Error Code X XX XXX
// 第一位 1 代表系统错误，系统错误一般是系统的bug或者程序问题引起； 2 代表普通错误，普通错误一般由用户的错误操作引起
// 第二三位代表模块
//
// 01 代表用户模块
// 02 基础数据
// 03 代表权限
// 04 代表代理商模块
// 05 代表供应商模块
// 06 系统基础配置
// 07 机票模块
// 08 运价模块
// 09 财务模块
// 后三位代表具体错误编码

type Error struct {
	local      LangType
	httpStatus int
	code       int
	err        error
}

func (e *Error) Error() string {
	return fmt.Sprintf("code: %d, msg: %s err: %v", e.code, GetErrorResp(string(e.local), e.code), e.err)
}

func (e *Error) SetLang(cxt *gin.Context) *Error {
	switch strings.ToLower(strings.TrimSpace(cxt.GetHeader("Accept-Language"))) {
	case "en":
		e.local = EN
	case "zh-tw":
		e.local = TW
	default:
		e.local = CN
	}
	return e
}

func (e *Error) SetCode(code int) *Error {
	e.code = code
	return e
}

func (e *Error) SetHttpStatus(httpStatus int) *Error {
	e.httpStatus = httpStatus
	return e
}

func (e *Error) SetError(err error) *Error {
	e.err = err
	return e
}

func (e *Error) GetError() string {
	if e.err != nil {
		return e.err.Error()
	}
	return ""
}

func (e *Error) GetMessage() string {
	return GetErrorResp(string(e.local), e.code)
}

func (e *Error) GetCode() int {
	return e.code
}

func (e *Error) GetHttpStatus() int {
	return e.httpStatus
}

func New(err error) *Error {
	return &Error{
		httpStatus: 200,
		code:       SystemError,
		err:        err,
	}
}

func NewString(err string) *Error {
	return &Error{
		httpStatus: 200,
		code:       SystemError,
		err:        errors.New(err),
	}
}

func NewStringf(format string, args ...any) *Error {
	return &Error{
		httpStatus: 200,
		code:       SystemError,
		err:        fmt.Errorf(format, args...),
	}
}

func Code(code int) *Error {
	return &Error{
		httpStatus: 200,
		code:       code,
	}
}
